{
"cells": [
{
"cell_type": "markdown",
"id": "39710952",
"metadata": {},
"source": [
"# Variational Quantum Eigensolver"
]
},
{
"cell_type": "markdown",
"id": "5e2598a1",
"metadata": {},
"source": [
"We provide a Perceval implementation of original photonic Variational Quantum Eigensolver (VQE) from Peruzzo, A. et al. in [1].\n",
"\n",
"This notebook provides computations of ground-state molecular energies for the Hamiltonian given by the following papers:\n",
"\n",
"$\\bullet$ A variational eigenvalue solver on a photonic quantum processor [1].\n",
" \n",
"$\\bullet$ Scalable Quantum Simulation of Molecular Energies [2] .\n",
" \n",
"$\\bullet$ Computation of Molecular Spectra on a Quantum Processor with an Error-Resilient Algorithm [3]"
]
},
{
"cell_type": "markdown",
"id": "14d8d0b4",
"metadata": {},
"source": [
"Importing the necessary packages for the computations:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "1e59ecca",
"metadata": {},
"outputs": [],
"source": [
"from tqdm.auto import tqdm\n",
"\n",
"import perceval as pcvl\n",
"\n",
"import numpy as np\n",
"from scipy.optimize import minimize\n",
"import random\n",
"import matplotlib.pyplot as plt\n",
"simulator = pcvl.Simulator(pcvl.NaiveBackend())"
]
},
{
"cell_type": "markdown",
"id": "111f0914",
"metadata": {},
"source": [
"## Implementation in Perceval\n",
"\n",
"Here we reproduce on Perceval the 2-qubit circuit used in [1] for VQE.\n",
"\n",
"We use path encoded qubits.\n",
"\n",
"Modes 0 and 5 are auxillary. 1$^\\text{st}$ qubit is path encoded in modes 1 and 2. 2$^\\text{nd}$ qubit in modes 3 and 4."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "22786406",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The circuit is :\n"
]
},
{
"data": {
"image/svg+xml": [
"\n",
""
],
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#List of the parameters φ1,φ2,...,φ8\n",
"List_Parameters=[]\n",
"\n",
"# VQE is a 6 optical mode circuit\n",
"VQE=pcvl.Circuit(6)\n",
"\n",
"VQE.add((1,2), pcvl.BS())\n",
"VQE.add((3,4), pcvl.BS())\n",
"List_Parameters.append(pcvl.Parameter(\"φ1\"))\n",
"VQE.add((2,),pcvl.PS(phi=List_Parameters[-1]))\n",
"List_Parameters.append(pcvl.Parameter(\"φ3\"))\n",
"VQE.add((4,),pcvl.PS(phi=List_Parameters[-1]))\n",
"VQE.add((1,2), pcvl.BS())\n",
"VQE.add((3,4), pcvl.BS())\n",
"List_Parameters.append(pcvl.Parameter(\"φ2\"))\n",
"VQE.add((2,),pcvl.PS(phi=List_Parameters[-1]))\n",
"List_Parameters.append(pcvl.Parameter(\"φ4\"))\n",
"VQE.add((4,),pcvl.PS(phi=List_Parameters[-1]))\n",
"\n",
"\n",
"# CNOT ( Post-selected with a success probability of 1/9) \n",
"VQE.add([0,1,2,3,4,5], pcvl.PERM([0,1,2,3,4,5]))#Identity PERM (permutation) for the purpose of drawing a nice circuit\n",
"VQE.add((3,4), pcvl.BS())\n",
"VQE.add([0,1,2,3,4,5], pcvl.PERM([0,1,2,3,4,5]))#Identity PERM (permutation) for the same purpose\n",
"VQE.add((0,1), pcvl.BS(pcvl.BS.r_to_theta(1/3)))\n",
"VQE.add((2,3), pcvl.BS(pcvl.BS.r_to_theta(1/3)))\n",
"VQE.add((4,5), pcvl.BS(pcvl.BS.r_to_theta(1/3)))\n",
"VQE.add([0,1,2,3,4,5], pcvl.PERM([0,1,2,3,4,5]))#Identity PERM (permutation) for the same purpose\n",
"VQE.add((3,4), pcvl.BS())\n",
"VQE.add([0,1,2,3,4,5], pcvl.PERM([0,1,2,3,4,5]))#Identity PERM (permutation) for the same purpose\n",
"\n",
"List_Parameters.append(pcvl.Parameter(\"φ5\"))\n",
"VQE.add((2,),pcvl.PS(phi=List_Parameters[-1]))\n",
"List_Parameters.append(pcvl.Parameter(\"φ7\"))\n",
"VQE.add((4,),pcvl.PS(phi=List_Parameters[-1]))\n",
"VQE.add((1,2), pcvl.BS())\n",
"VQE.add((3,4), pcvl.BS())\n",
"List_Parameters.append(pcvl.Parameter(\"φ6\"))\n",
"VQE.add((2,),pcvl.PS(phi=List_Parameters[-1]))\n",
"List_Parameters.append(pcvl.Parameter(\"φ8\"))\n",
"VQE.add((4,),pcvl.PS(phi=List_Parameters[-1]))\n",
"VQE.add((1,2), pcvl.BS())\n",
"VQE.add((3,4), pcvl.BS())\n",
"\n",
"# Mode 0 and 5 are auxillary.\n",
"#1st qubit is path encoded in modes 1 & 2\n",
"#2nd qubit in 3 & 4\n",
"\n",
"print(\"The circuit is :\")\n",
"pcvl.pdisplay(VQE)"
]
},
{
"cell_type": "markdown",
"id": "91a1daa5",
"metadata": {},
"source": [
"## Logical input and output states\n",
"\n",
"Logical states are path encoded on the Fock States."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "09dba52d",
"metadata": {},
"outputs": [],
"source": [
"#Input states of the photonic circuit\n",
"input_states = {\n",
" pcvl.BasicState([0,1,0,1,0,0]):\"|00>\"}\n",
"\n",
"#Outputs in the computational basis\n",
"output_states = {\n",
" pcvl.BasicState([0,1,0,1,0,0]):\"|00>\",\n",
" pcvl.BasicState([0,1,0,0,1,0]):\"|01>\",\n",
" pcvl.BasicState([0,0,1,1,0,0]):\"|10>\",\n",
" pcvl.BasicState([0,0,1,0,1,0]):\"|11>\"}"
]
},
{
"cell_type": "markdown",
"id": "d2d1cf4f",
"metadata": {},
"source": [
"## Loss function for the variational algorithm\n",
"\n",
"For a given state $|\\psi \\rangle$ the Rayleigh-Ritz quotient is given by:\n",
"$$ \\frac{\\langle \\psi | \\mathcal{H} | \\psi \\rangle}{\\langle \\psi |\\psi \\rangle},$$\n",
"This is computed in Perceval by explicitly computing $|\\psi \\rangle$ ( which is the output of the simulated photonic circuit).\n",
"Determining the smallest/ground state eigenvalue is done through a variational approach with Rayleigh-Ritz quotient as the loss function.\n",
"\n",
"Using a classical optimisation algorithm, and the simulations given by Perceval we find the eigenvector which minimises the Rayleigh-Ritz quotient together with its associated eigenvalue ( the ground state eigenvalue), which reprensents the solution of the VQE.\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "db3c68e5",
"metadata": {},
"outputs": [],
"source": [
"\n",
"def minimize_loss(lp=None): \n",
" # Updating the parameters on the chip\n",
" for idx, p in enumerate(lp): \n",
" List_Parameters[idx].set_value(p)\n",
" \n",
" #Simulation, Quantum processing part of the VQE\n",
" simulator.set_circuit(VQE)\n",
" \n",
" # Collecting the output state of the circuit \n",
" psi = [] \n",
" for input_state in input_states:\n",
" for output_state in output_states: #|00>,|01>,|10>,|11>\n",
" psi.append(simulator.prob_amplitude(input_state,output_state))\n",
" \n",
" #Evaluating the mean value of the Hamiltonian. # The Hamiltonians H is defined in the following block\n",
" psi_prime=np.dot(H[R][1],psi)\n",
" loss = np.real(sum(sum(np.conjugate(psi)*np.array(psi_prime[0]))))/(sum([i*np.conjugate(i) for i in psi]))\n",
" loss=np.real(loss)\n",
" \n",
" tq.set_description('%g / %g loss function=%g' % (R, len(H), loss))\n",
" return(loss)\n"
]
},
{
"cell_type": "markdown",
"id": "0f7d26a2",
"metadata": {},
"source": [
"## Hamiltonians for VQE\n",
"\n",
"In this section we define the 3 Hamiltonians given by the 3 papers [1-3]\n",
"\n",
"Perceval can compute the state vector, which is the output of the photonic quantum circuit, explicitly.\n",
"This eliminates the need for using algorithms to estimate the expectation value.\n",
"\n",
"A Hamiltonian can be written as :\n",
"$$\\mathcal{H}= \\sum_{\\sigma }h_{\\sigma}\\sigma$$\n",
"where $h_{\\sigma} \\in \\mathbb{R}$ and $\\sigma$ are pauli operators."
]
},
{
"cell_type": "markdown",
"id": "97e78feb",
"metadata": {},
"source": [
"### Hamiltonian n°1 [\\[1\\]](https://www.nature.com/articles/ncomms5213)\n",
"\n",
"Hamiltonian coefficents on the [supplementary paper](https://static-content.springer.com/esm/art%3A10.1038%2Fncomms5213/MediaObjects/41467_2014_BFncomms5213_MOESM1050_ESM.pdf):\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "b3f89652",
"metadata": {},
"outputs": [],
"source": [
"Hamiltonian_elem = np.array([[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], #00\n",
" [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]], #II\n",
" [[0,1,0,0],[1,0,0,0],[0,0,0,1],[0,0,1,0]], #IX\n",
" [[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,-1]], #IZ\n",
" [[0,0,1,0],[0,0,0,1],[1,0,0,0],[0,1,0,0]], #XI\n",
" [[0,0,0,1],[0,0,1,0],[0,1,0,0],[1,0,0,0]], #XX\n",
" [[0,0,1,0],[0,0,0,-1],[1,0,0,0],[0,-1,0,0]], #XZ\n",
" [[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,-1]], #ZI\n",
" [[0,1,0,0],[1,0,0,0],[0,0,0,-1],[0,0,-1,0]], #ZX\n",
" [[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]) #ZZ\n",
"\n",
"\n",
"Hamiltonian_coef = np.matrix(\n",
"# [R,II,IX,IZ,XI,XZ,XX,ZI,ZX,ZZ] \n",
"[[0.05,33.9557,-0.1515,-2.4784,-0.1515,0.1412,0.1515,-2.4784,0.1515,0.2746],\n",
"[0.1,13.3605,-0.1626,-2.4368,-0.1626,0.2097,0.1626,-2.4368,0.1626,0.2081],\n",
"[0.15,6.8232,-0.1537,-2.3801,-0.1537,0.2680,0.1537,-2.3801,0.1537,0.1512],\n",
"[0.2,3.6330,-0.1405,-2.2899,-0.1405,0.3027,0.1405,-2.2899,0.1405,0.1176],\n",
"[0.25,1.7012,-0.1324,-2.1683,-0.1324,0.3211,0.1324,-2.1683,0.1324,0.1010],\n",
"[0.3,0.3821,-0.1306,-2.0305,-0.1306,0.3303,0.1306,-2.0305,0.1306,0.0943],\n",
"[0.35,-0.5810,-0.1335,-1.8905,-0.1335,0.3344,0.1335,-1.8905,0.1335,0.0936],\n",
"[0.4,-1.3119,-0.1396,-1.7568,-0.1396,0.3352,0.1396,-1.7568,0.1396,0.0969],\n",
"[0.45,-1.8796,-0.1477,-1.6339,-0.1477,0.3339,0.1477,-1.6339,0.1477,0.1030],\n",
"[0.5,-2.3275,-0.1570,-1.5236,-0.1570,0.3309,0.1570,-1.5236,0.1570,0.1115],\n",
"[0.55,-2.6844,-0.1669,-1.4264,-0.1669,0.3264,0.1669,-1.4264,0.1669,0.1218],\n",
"[0.6,-2.9708,-0.1770,-1.3418,-0.1770,0.3206,0.1770,-1.3418,0.1770,0.1339],\n",
"[0.65,-3.2020,-0.1871,-1.2691,-0.1871,0.3135,0.1871,-1.2691,0.1871,0.1475],\n",
"[0.7,-3.3893,-0.1968,-1.2073,-0.1968,0.3052,0.1968,-1.2073,0.1968,0.1626],\n",
"[0.75,-3.5417,-0.2060,-1.1552,-0.2060,0.2958,0.2060,-1.1552,0.2060,0.1791],\n",
"[0.8,-3.6660,-0.2145,-1.1117,-0.2145,0.2853,0.2145,-1.1117,0.2145,0.1968],\n",
"[0.85,-3.7675,-0.2222,-1.0758,-0.2222,0.2738,0.2222,-1.0758,0.2222,0.2157],\n",
"[0.9,-3.8505,-0.2288,-1.0466,-0.2288,0.2613,0.2288,-1.0466,0.2288,0.2356],\n",
"[0.95,-3.9183,-0.2343,-1.0233,-0.2343,0.2481,0.2343,-1.0233,0.2343,0.2564],\n",
"[1,-3.9734,-0.2385,-1.0052,-0.2385,0.2343,0.2385,-1.0052,0.2385,0.2779],\n",
"[1.05,-4.0180,-0.2414,-0.9916,-0.2414,0.2199,0.2414,-0.9916,0.2414,0.3000],\n",
"[1.1,-4.0539,-0.2430,-0.9820,-0.2430,0.2053,0.2430,-0.9820,0.2430,0.3225],\n",
"[1.15,-4.0825,-0.2431,-0.9758,-0.2431,0.1904,0.2431,-0.9758,0.2431,0.3451],\n",
"[1.2,-4.1050,-0.2418,-0.9725,-0.2418,0.1756,0.2418,-0.9725,0.2418,0.3678],\n",
"[1.25,-4.1224,-0.2392,-0.9716,-0.2392,0.1610,0.2392,-0.9716,0.2392,0.3902],\n",
"[1.3,-4.1356,-0.2353,-0.9728,-0.2353,0.1466,0.2353,-0.9728,0.2353,0.4123],\n",
"[1.35,-4.1454,-0.2301,-0.9757,-0.2301,0.1327,0.2301,-0.9757,0.2301,0.4339],\n",
"[1.4,-4.1523,-0.2239,-0.9798,-0.2239,0.1194,0.2239,-0.9798,0.2239,0.4549],\n",
"[1.45,-4.1568,-0.2167,-0.9850,-0.2167,0.1068,0.2167,-0.9850,0.2167,0.4751],\n",
"[1.5,-4.1594,-0.2086,-0.9910,-0.2086,0.0948,0.2086,-0.9910,0.2086,0.4945],\n",
"[1.55,-4.1605,-0.1998,-0.9975,-0.1998,0.0837,0.1998,-0.9975,0.1998,0.5129],\n",
"[1.6,-4.1602,-0.1905,-1.0045,-0.1905,0.0734,0.1905,-1.0045,0.1905,0.5304],\n",
"[1.65,-4.1589,-0.1807,-1.0116,-0.1807,0.0640,0.1807,-1.0116,0.1807,0.5468],\n",
"[1.7,-4.1568,-0.1707,-1.0189,-0.1707,0.0555,0.1707,-1.0189,0.1707,0.5622],\n",
"[1.75,-4.1540,-0.1605,-1.0262,-0.1605,0.0479,0.1605,-1.0262,0.1605,0.5766],\n",
"[1.8,-4.1508,-0.1503,-1.0334,-0.1503,0.0410,0.1503,-1.0334,0.1503,0.5899],\n",
"[1.85,-4.1471,-0.1403,-1.0404,-0.1403,0.0350,0.1403,-1.0404,0.1403,0.6023],\n",
"[1.9,-4.1431,-0.1305,-1.0473,-0.1305,0.0297,0.1305,-1.0473,0.1305,0.6138],\n",
"[1.95,-4.1390,-0.1210,-1.0540,-0.1210,0.0251,0.1210,-1.0540,0.1210,0.6244],\n",
"[2,-4.1347,-0.1119,-1.0605,-0.1119,0.0212,0.1119,-1.0605,0.1119,0.6342],\n",
"[2.05,-4.1303,-0.1031,-1.0667,-0.1031,0.0178,0.1031,-1.0667,0.1031,0.6432],\n",
"[2.1,-4.1258,-0.0949,-1.0727,-0.0949,0.0148,0.0949,-1.0727,0.0949,0.6516],\n",
"[2.15,-4.1214,-0.0871,-1.0785,-0.0871,0.0124,0.0871,-1.0785,0.0871,0.6594],\n",
"[2.2,-4.1169,-0.0797,-1.0840,-0.0797,0.0103,0.0797,-1.0840,0.0797,0.6666],\n",
"[2.25,-4.1125,-0.0729,-1.0893,-0.0729,0.0085,0.0729,-1.0893,0.0729,0.6733],\n",
"[2.3,-4.1082,-0.0665,-1.0944,-0.0665,0.0070,0.0665,-1.0944,0.0665,0.6796],\n",
"[2.35,-4.1040,-0.0606,-1.0993,-0.0606,0.0058,0.0606,-1.0993,0.0606,0.6854],\n",
"[2.4,-4.0998,-0.0551,-1.1040,-0.0551,0.0047,0.0551,-1.1040,0.0551,0.6909],\n",
"[2.45,-4.0957,-0.0500,-1.1085,-0.0500,0.0039,0.0500,-1.1085,0.0500,0.6961],\n",
"[2.5,-4.0918,-0.0454,-1.1128,-0.0454,0.0032,0.0454,-1.1128,0.0454,0.7010],\n",
"[2.55,-4.0879,-0.0411,-1.1170,-0.0411,0.0026,0.0411,-1.1170,0.0411,0.7056],\n",
"[2.6,-4.0841,-0.0371,-1.1210,-0.0371,0.0021,0.0371,-1.1210,0.0371,0.7099],\n",
"[2.65,-4.0805,-0.0335,-1.1248,-0.0335,0.0017,0.0335,-1.1248,0.0335,0.7141],\n",
"[2.7,-4.0769,-0.0303,-1.1285,-0.0303,0.0014,0.0303,-1.1285,0.0303,0.7181],\n",
"[2.75,-4.0735,-0.0273,-1.1321,-0.0273,0.0011,0.0273,-1.1321,0.0273,0.7218],\n",
"[2.8,-4.0701,-0.0245,-1.1356,-0.0245,0.0009,0.0245,-1.1356,0.0245,0.7254],\n",
"[2.85,-4.0669,-0.0221,-1.1389,-0.0221,0.0007,0.0221,-1.1389,0.0221,0.7289],\n",
"[2.9,-4.0638,-0.0198,-1.1421,-0.0198,0.0006,0.0198,-1.1421,0.0198,0.7322],\n",
"[2.95,-4.0607,-0.0178,-1.1452,-0.0178,0.0005,0.0178,-1.1452,0.0178,0.7354],\n",
"[3,-4.0578,-0.0159,-1.1482,-0.0159,0.0004,0.0159,-1.1482,0.0159,0.7385],\n",
"[3.05,-4.0549,-0.0142,-1.1511,-0.0142,0.0003,0.0142,-1.1511,0.0142,0.7414],\n",
"[3.1,-4.0521,-0.0127,-1.1539,-0.0127,0.0002,0.0127,-1.1539,0.0127,0.7443],\n",
"[3.15,-4.0494,-0.0114,-1.1566,-0.0114,0.0002,0.0114,-1.1566,0.0114,0.7470],\n",
"[3.2,-4.0468,-0.0101,-1.1592,-0.0101,0.0001,0.0101,-1.1592,0.0101,0.7497],\n",
"[3.25,-4.0443,-0.0090,-1.1618,-0.0090,0.0001,0.0090,-1.1618,0.0090,0.7522],\n",
"[3.3,-4.0418,-0.0081,-1.1643,-0.0081,0.0001,0.0081,-1.1643,0.0081,0.7547],\n",
"[3.35,-4.0394,-0.0072,-1.1666,-0.0072,0.0001,0.0072,-1.1666,0.0072,0.7571],\n",
"[3.4,-4.0371,-0.0064,-1.1690,-0.0064,0.0001,0.0064,-1.1690,0.0064,0.7595],\n",
"[3.45,-4.0349,-0.0056,-1.1712,-0.0056,0.0000,0.0056,-1.1712,0.0056,0.7617],\n",
"[3.5,-4.0327,-0.0050,-1.1734,-0.0050,0.0000,0.0050,-1.1734,0.0050,0.7639],\n",
"[3.55,-4.0306,-0.0044,-1.1756,-0.0044,0.0000,0.0044,-1.1756,0.0044,0.7661],\n",
"[3.6,-4.0285,-0.0039,-1.1776,-0.0039,0.0000,0.0039,-1.1776,0.0039,0.7681],\n",
"[3.65,-4.0265,-0.0035,-1.1796,-0.0035,0.0000,0.0035,-1.1796,0.0035,0.7702],\n",
"[3.7,-4.0245,-0.0030,-1.1816,-0.0030,0.0000,0.0030,-1.1816,0.0030,0.7721],\n",
"[3.75,-4.0226,-0.0027,-1.1835,-0.0027,0.0000,0.0027,-1.1835,0.0027,0.7740],\n",
"[3.8,-4.0208,-0.0024,-1.1854,-0.0024,0.0000,0.0024,-1.1854,0.0024,0.7759],\n",
"[3.85,-4.0190,-0.0021,-1.1872,-0.0021,0.0000,0.0021,-1.1872,0.0021,0.7777],\n",
"[3.9,-4.0172,-0.0018,-1.1889,-0.0018,0.0000,0.0018,-1.1889,0.0018,0.7795],\n",
"[3.95,-4.0155,-0.0016,-1.1906,-0.0016,0.0000,0.0016,-1.1906,0.0016,0.7812]]\n",
")\n",
"\n",
"\n",
"#Building the Hamiltonian H[0]= Radius, H[1]=H(Radius)\n",
"H1=[]\n",
"(n,m)=Hamiltonian_coef.shape\n",
"for i in range(n): #i = Radius\n",
" h_0=1.0*np.matrix(Hamiltonian_elem[0])\n",
" for j in range(1,m):\n",
" h_0+= Hamiltonian_coef[i,j]*np.matrix(Hamiltonian_elem[j])\n",
" H1.append([Hamiltonian_coef[i,0],h_0])"
]
},
{
"cell_type": "markdown",
"id": "913d4aea",
"metadata": {},
"source": [
"### Hamiltonian n°2 [\\[2\\]](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.73.58)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "87f168f2",
"metadata": {},
"outputs": [],
"source": [
"Hamiltonian_elem = np.array([[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], #00\n",
" [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]], #II\n",
" [[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,-1]], #ZI\n",
" [[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,-1]], #IZ\n",
" [[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], #ZZ\n",
" [[0,0,0,1],[0,0,1,0],[0,1,0,0],[1,0,0,0]], #XX\n",
" [[0,0,0,-1],[0,0,1,0],[0,1,0,0],[-1,0,0,0]]]) #YY\n",
" \n",
"\n",
"Hamiltonian_coef = np.matrix(\n",
"# [R,II,ZI,IZ,ZZ,XX,YY] \n",
"[[0.20,2.8489,0.5678,-1.4508,0.6799,0.0791,0.0791],\n",
"[0.25,2.1868,0.5449,-1.2870,0.6719,0.0798,0.0798],\n",
"[0.30,1.7252,0.5215,-1.1458,0.6631,0.0806,0.0806],\n",
"[0.35,1.3827,0.4982,-1.0226,0.6537,0.0815,0.0815],\n",
"[0.40,1.1182,0.4754,-0.9145,0.6438,0.0825,0.0825],\n",
"[0.45,0.9083,0.4534,-0.8194,0.6336,0.0835,0.0835],\n",
"[0.50,0.7381,0.4325,-0.7355,0.6233,0.0846,0.0846],\n",
"[0.55,0.5979,0.4125,-0.6612,0.6129,0.0858,0.0858],\n",
"[0.60,0.4808,0.3937,-0.5950,0.6025,0.0870,0.0870],\n",
"[0.65,0.3819,0.3760,-0.5358,0.5921,0.0883,0.0883],\n",
"[0.70,0.2976,0.3593,-0.4826,0.5818,0.0896,0.0896],\n",
"[0.75,0.2252,0.3435,-0.4347,0.5716,0.0910,0.0910],\n",
"[0.80,0.1626,0.3288,-0.3915,0.5616,0.0925,0.0925],\n",
"[0.85,0.1083,0.3149,-0.3523,0.5518,0.0939,0.0939],\n",
"[0.90,0.0609,0.3018,-0.3168,0.5421,0.0954,0.0954],\n",
"[0.95,0.0193,0.2895,-0.2845,0.5327,0.0970,0.0970],\n",
"[1.00,-0.0172,0.2779,-0.2550,0.5235,0.0986,0.0986],\n",
"[1.05,-0.0493,0.2669,-0.2282,0.5146,0.1002,0.1002],\n",
"[1.10,-0.0778,0.2565,-0.2036,0.5059,0.1018,0.1018],\n",
"[1.15,-0.1029,0.2467,-0.1810,0.4974,0.1034,0.1034],\n",
"[1.20,-0.1253,0.2374,-0.1603,0.4892,0.1050,0.1050],\n",
"[1.25,-0.1452,0.2286,-0.1413,0.4812,0.1067,0.1067],\n",
"[1.30,-0.1629,0.2203,-0.1238,0.4735,0.1083,0.1083],\n",
"[1.35,-0.1786,0.2123,-0.1077,0.4660,0.1100,0.1100],\n",
"[1.40,-0.1927,0.2048,-0.0929,0.4588,0.1116,0.1116],\n",
"[1.45,-0.2053,0.1976,-0.0792,0.4518,0.1133,0.1133],\n",
"[1.50,-0.2165,0.1908,-0.0666,0.4451,0.1149,0.1149],\n",
"[1.55,-0.2265,0.1843,-0.0549,0.4386,0.1165,0.1165],\n",
"[1.60,-0.2355,0.1782,-0.0442,0.4323,0.1181,0.1181],\n",
"[1.65,-0.2436,0.1723,-0.0342,0.4262,0.1196,0.1196],\n",
"[1.70,-0.2508,0.1667,-0.0251,0.4204,0.1211,0.1211],\n",
"[1.75,-0.2573,0.1615,-0.0166,0.4148,0.1226,0.1226],\n",
"[1.80,-0.2632,0.1565,-0.0088,0.4094,0.1241,0.1241],\n",
"[1.85,-0.2684,0.1517,-0.0015,0.4042,0.1256,0.1256],\n",
"[1.90,-0.2731,0.1472,0.0052,0.3992,0.1270,0.1270],\n",
"[1.95,-0.2774,0.1430,0.0114,0.3944,0.1284,0.1284],\n",
"[2.00,-0.2812,0.1390,0.0171,0.3898,0.1297,0.1297],\n",
"[2.05,-0.2847,0.1352,0.0223,0.3853,0.1310,0.1310],\n",
"[2.10,-0.2879,0.1316,0.0272,0.3811,0.1323,0.1323],\n",
"[2.15,-0.2908,0.1282,0.0317,0.3769,0.1335,0.1335],\n",
"[2.20,-0.2934,0.1251,0.0359,0.3730,0.1347,0.1347],\n",
"[2.25,-0.2958,0.1221,0.0397,0.3692,0.1359,0.1359],\n",
"[2.30,-0.2980,0.1193,0.0432,0.3655,0.1370,0.1370],\n",
"[2.35,-0.3000,0.1167,0.0465,0.3620,0.1381,0.1381],\n",
"[2.40,-0.3018,0.1142,0.0495,0.3586,0.1392,0.1392],\n",
"[2.45,-0.3035,0.1119,0.0523,0.3553,0.1402,0.1402],\n",
"[2.50,-0.3051,0.1098,0.0549,0.3521,0.1412,0.1412],\n",
"[2.55,-0.3066,0.1078,0.0572,0.3491,0.1422,0.1422],\n",
"[2.60,-0.3079,0.1059,0.0594,0.3461,0.1432,0.1432],\n",
"[2.65,-0.3092,0.1042,0.0614,0.3433,0.1441,0.1441],\n",
"[2.70,-0.3104,0.1026,0.0632,0.3406,0.1450,0.1450],\n",
"[2.75,-0.3115,0.1011,0.0649,0.3379,0.1458,0.1458],\n",
"[2.80,-0.3125,0.0997,0.0665,0.3354,0.1467,0.1467],\n",
"[2.85,-0.3135,0.0984,0.0679,0.3329,0.1475,0.1475]]\n",
"\n",
")\n",
"\n",
"\n",
"#Building the Hamiltonian H[0]= Radius, H[1]=H(Radius)\n",
"H2=[]\n",
"(n,m)=Hamiltonian_coef.shape\n",
"for i in range(n): #i = Radius\n",
" h_0=1.0*np.matrix(Hamiltonian_elem[0])\n",
" for j in range(1,m):\n",
" h_0+= Hamiltonian_coef[i,j]*np.matrix(Hamiltonian_elem[j])\n",
" H2.append([Hamiltonian_coef[i,0],h_0])"
]
},
{
"cell_type": "markdown",
"id": "920b16b4",
"metadata": {},
"source": [
"### Hamiltonian n°3 [\\[3\\]](https://journals.aps.org/prx/abstract/10.1103/PhysRevX.8.011021)\n",
"\n",
"Hamiltonian coefficents on the [supplementary material](https://journals.aps.org/prx/supplemental/10.1103/PhysRevX.8.011021/Supplementary.pdf)."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "1a6576f0",
"metadata": {},
"outputs": [],
"source": [
"Hamiltonian_elem = np.array([[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], #00\n",
" [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]], #II\n",
" [[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,-1]], #ZI\n",
" [[0,0,0,1],[0,0,1,0],[0,1,0,0],[1,0,0,0]], #XX\n",
" [[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,-1]], #IZ\n",
" [[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]) #ZZ\n",
"\n",
" \n",
"Hamiltonian_coef = np.matrix(\n",
"# [R,II ZI XX IZ ZZ],\n",
"[[0.05, 1.00777E+01 ,-1.05533E+00 ,1.55708*10**(-1) ,-1.05533E+00 ,1.39333*10**(-2)],\n",
"[0.10, 4.75665E+00 ,-1.02731E+00 ,1.56170*10**(-1) ,-1.02731E+00 ,1.38667*10**(-2)],\n",
"[0.15, 2.94817E+00 ,-9.84234*10**(-1) ,1.56930*10**(-1) ,-9.84234*10**(-1) ,1.37610*10**(-2)],\n",
"[0.20, 2.01153E+00 ,-9.30489*10**(-1) ,1.57973*10**(-1) ,-9.30489*10**(-1) ,1.36238*10**(-2)],\n",
"[0.25, 1.42283E+00 ,-8.70646*10**(-1) ,1.59277*10**(-1) ,-8.70646*10**(-1) ,1.34635*10**(-2)],\n",
"[0.30, 1.01018E+00 ,-8.08649*10**(-1) ,1.60818*10**(-1) ,-8.08649*10**(-1) ,1.32880*10**(-2)],\n",
"[0.35, 7.01273*10**(-1) ,-7.47416*10**(-1) ,1.62573*10**(-1) ,-7.47416*10**(-1) ,1.31036*10**(-2)],\n",
"[0.40, 4.60364*10**(-1) ,-6.88819*10**(-1) ,1.64515*10**(-1) ,-6.88819*10**(-1) ,1.29140*10**(-2)],\n",
"[0.45, 2.67547*10**(-1) ,-6.33890*10**(-1) ,1.66621*10**(-1) ,-6.33890*10**(-1) ,1.27192*10**(-2)],\n",
"[0.50, 1.10647*10**(-1) ,-5.83080*10**(-1) ,1.68870*10**(-1) ,-5.83080*10**(-1) ,1.25165*10**(-2)],\n",
"[0.55, -1.83734*10**(-2), -5.36489*10**(-1), 1.71244*10**(-1), -5.36489*10**(-1), 1.23003*10**(-2)],\n",
"[0.65, -2.13932*10**(-1), -4.55433*10**(-1), 1.76318*10**(-1), -4.55433*10**(-1), 1.18019*10**(-2)],\n",
"[0.75, -3.49833*10**(-1), -3.88748*10**(-1), 1.81771*10**(-1), -3.88748*10**(-1), 1.11772*10**(-2)],\n",
"[0.85, -4.45424*10**(-1), -3.33747*10**(-1), 1.87562*10**(-1), -3.33747*10**(-1), 1.04061*10**(-2)],\n",
"[0.95, -5.13548*10**(-1), -2.87796*10**(-1), 1.93650*10**(-1), -2.87796*10**(-1), 9.50345*10**(-3)],\n",
"[1.05, -5.62600*10**(-1), -2.48783*10**(-1), 1.99984*10**(-1), -2.48783*10**(-1), 8.50998*10**(-3)],\n",
"[1.15, -5.97973*10**(-1), -2.15234*10**(-1), 2.06495*10**(-1), -2.15234*10**(-1), 7.47722*10**(-3)],\n",
"[1.25, -6.23223*10**(-1), -1.86173*10**(-1), 2.13102*10**(-1), -1.86173*10**(-1), 6.45563*10**(-3)],\n",
"[1.35, -6.40837*10**(-1), -1.60926*10**(-1), 2.19727*10**(-1), -1.60926*10**(-1), 5.48623*10**(-3)],\n",
"[1.45, -6.52661*10**(-1), -1.38977*10**(-1), 2.26294*10**(-1), -1.38977*10**(-1), 4.59760*10**(-3)],\n",
"[1.55, -6.60117*10**(-1), -1.19894*10**(-1), 2.32740*10**(-1), -1.19894*10**(-1), 3.80558*10**(-3)],\n",
"[1.65, -6.64309*10**(-1), -1.03305*10**(-1), 2.39014*10**(-1), -1.03305*10**(-1), 3.11545*10**(-3)],\n",
"[1.75, -6.66092*10**(-1), -8.88906*10**(-2), 2.45075*10**(-1), -8.88906*10**(-2), 2.52480*10**(-3)],\n",
"[1.85, -6.66126*10**(-1), -7.63712*10**(-2), 2.50896*10**(-1), -7.63712*10**(-2), 2.02647*10**(-3)],\n",
"[1.95, -6.64916*10**(-1), -6.55065*10**(-2), 2.56458*10**(-1), -6.55065*10**(-2), 1.61100*10**(-3)],\n",
"[2.05, -6.62844*10**(-1), -5.60866*10**(-2), 2.61750*10**(-1), -5.60866*10**(-2), 1.26812*10**(-3)],\n",
"[2.15, -6.60199*10**(-1), -4.79275*10**(-2), 2.66768*10**(-1), -4.79275*10**(-2), 9.88000*10**(-4)],\n",
"[2.25, -6.57196*10**(-1), -4.08672*10**(-2), 2.71512*10**(-1), -4.08672*10**(-2), 7.61425*10**(-4)],\n",
"[2.35, -6.53992*10**(-1), -3.47636*10**(-2), 2.75986*10**(-1), -3.47636*10**(-2), 5.80225*10**(-4)],\n",
"[2.45, -6.50702*10**(-1), -2.94924*10**(-2), 2.80199*10**(-1), -2.94924*10**(-2), 4.36875*10**(-4)],\n",
"[2.55, -6.47408*10**(-1), -2.49459*10**(-2), 2.84160*10**(-1), -2.49459*10**(-2), 3.25025*10**(-4)],\n",
"[2.65, -6.44165*10**(-1), -2.10309*10**(-2), 2.87881*10**(-1), -2.10309*10**(-2), 2.38800*10**(-4)],\n",
"[2.75, -6.41011*10**(-1), -1.76672*10**(-2), 2.91376*10**(-1), -1.76672*10**(-2), 1.73300*10**(-4)],\n",
"[2.85, -6.37971*10**(-1), -1.47853*10**(-2), 2.94658*10**(-1), -1.47853*10**(-2), 1.24200*10**(-4)],\n",
"[2.95, -6.35058*10**(-1), -1.23246*10**(-2), 2.97741*10**(-1), -1.23246*10**(-2), 8.78750*10**(-5)],\n",
"[3.05, -6.32279*10**(-1), -1.02318*10**(-2), 3.00638*10**(-1), -1.02317*10**(-2), 6.14500*10**(-5)],\n",
"[3.15, -6.29635*10**(-1), -8.45958*10**(-3), 3.03362*10**(-1), -8.45958*10**(-3), 4.24250*10**(-5)],\n",
"[3.25, -6.27126*10**(-1), -6.96585*10**(-3), 3.05927*10**(-1), -6.96585*10**(-3), 2.89500*10**(-5)],\n",
"[3.35, -6.24746*10**(-1), -5.71280*10**(-3), 3.08344*10**(-1), -5.71280*10**(-3), 1.95500*10**(-5)],\n",
"[3.45, -6.22491*10**(-1), -4.66670*10**(-3), 3.10625*10**(-1), -4.66670*10**(-3), 1.30500*10**(-5)],\n",
"[3.55, -6.20353*10**(-1), -3.79743*10**(-3), 3.12780*10**(-1), -3.79743*10**(-3), 8.57500*10**(-6)],\n",
"[3.65, -6.18325*10**(-1), -3.07840*10**(-3), 3.14819*10**(-1), -3.07840*10**(-3), 5.60000*10**(-6)],\n",
"[3.75, -6.16401*10**(-1), -2.48625*10**(-3), 3.16750*10**(-1), -2.48625*10**(-3), 3.60000*10**(-6)],\n",
"[3.85, -6.14575*10**(-1), -2.00063*10**(-3), 3.18581*10**(-1), -2.00062*10**(-3), 2.27500*10**(-6)],\n",
"[3.95, -6.12839*10**(-1), -1.60393*10**(-3), 3.20320*10**(-1), -1.60392*10**(-3), 1.42500*10**(-6)]] )\n",
" \n",
"#Building the Hamiltonian H[0]= Radius, H[1]=H(Radius)\n",
"H3=[]\n",
"(n,m)=Hamiltonian_coef.shape\n",
"for i in range(n): #i = Radius\n",
" h_0=1.0*np.matrix(Hamiltonian_elem[0])\n",
" for j in range(1,m):\n",
" h_0+= Hamiltonian_coef[i,j]*np.matrix(Hamiltonian_elem[j])\n",
" H3.append([Hamiltonian_coef[i,0],h_0])"
]
},
{
"cell_type": "markdown",
"id": "b95733d2",
"metadata": {},
"source": [
"## Varational quantum eigenvalue solver simulation\n",
"\n",
"We use the Nelder-Mead minimisation algorithm [4] from the `scipy.optimize` package.\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "c8096d2c",
"metadata": {},
"source": [
"### Simulation n°1 "
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "29c10704",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "211267153d9241369b1e816ab553b0fe",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Minimizing...: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tq = tqdm(desc='Minimizing...') #Displaying progress bar\n",
"radius1=[]\n",
"E1=[]\n",
"init_param=[]\n",
"\n",
"H=H1\n",
"\n",
"for R in range(len(H)): #We try to find the ground state eigenvalue for each radius R\n",
" radius1.append(H[R][0])\n",
" if (init_param==[]): #\n",
" init_param = [2*(np.pi)*random.random() for _ in List_Parameters]\n",
" else:\n",
" for i in range(len(init_param)):\n",
" init_param[i]=VQE.get_parameters()[i]._value\n",
" \n",
" # Finding the ground state eigen value for each H(R)\n",
" result=minimize(minimize_loss,init_param,method='Nelder-Mead')\n",
" \n",
" E1.append(result.get('fun'))\n",
" tq.set_description('Finished' )\n",
" "
]
},
{
"cell_type": "markdown",
"id": "29c9e0f2",
"metadata": {},
"source": [
"#### Simulation 1: computing the theoretical eigenvalues of H\n",
"\n",
" We use the numpy linalg package."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "5c5bba77",
"metadata": {},
"outputs": [],
"source": [
"E1_th=[]\n",
"for h in H:\n",
" l0=np.linalg.eigvals(h[1])\n",
" l0.sort()\n",
" E1_th.append(min(l0))"
]
},
{
"cell_type": "markdown",
"id": "dad5309a",
"metadata": {},
"source": [
"#### Simulation 1: plotting the results\n",
"\n",
"The minimum eigenvalues of H are plotted in orange.\n",
"\n",
"The eigenvalues found with Perceval are the crosses"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "6134240e",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEGCAYAAABsLkJ6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAAA4pElEQVR4nO3deXxU1fn48c+TgICyCQREAgYjyBoSCBGCLILghlbLJhAK2rpj6pfWjX7boj/b2mr12xQFtQrooCCIu3UBAZWwBYGwCwFUMEJACaBsSZ7fH/fOMAlJSEJmhmSe9+s1r8y5c5dn7iTz5Jxz7zmiqhhjjAk/EaEOwBhjTGhYAjDGmDBlCcAYY8KUJQBjjAlTlgCMMSZM1Qh1AOXRpEkTjYmJCXUYxhhTpaxatWqfqkYVXV6lEkBMTAwZGRmhDsMYY6oUEfm6uOXWBGSMMWEq4AlARGqLyAoRWSsiG0TkEXd5axFZLiLbRGS2iJwT6FiMMcacFIwawDGgv6p2AeKBq0WkB/B34GlVvQT4Efh1EGIxxhjjCngfgDpjTRx2izXdhwL9gVHu8hnAJGBKoOMxwXfixAl27drF0aNHQx2KMdVa7dq1iY6OpmbNmmVaPyidwCISCawCLgGeAbKAA6qa566yC2hRwra3A7cDtGrVKvDBmkq3a9cu6tWrR0xMDCIS6nCMqZZUlf3797Nr1y5at25dpm2C0gmsqvmqGg9EA0lAu3Js+7yqJqpqYlTUKVcxlWrq4izSs/YVWpaetY+pi7PKtR9zZo4ePUrjxo3ty9+YABIRGjduXK6adlCvAlLVA8BCoCfQUES8NZBoYHdlHy8uugHjX13tSwLpWfsY/+pq4qIbVPahzGnYl78xgVfev7OANwGJSBRwQlUPiEgdYCBOB/BCYCgwCxgLvF3Zx06ObcLkUQmMf2UZKW324tneksmjEkiObVLZhzLGmConGDWA5sBCEckEVgKfqOp7wIPABBHZBjQGXgzEwZNjm5DSOou0dc1IuayVffmHof379xMfH098fDwXXHABLVq0ID4+noYNG9KhQ4egxvLWW2+xceNGX/lPf/oT8+fPL/d+du7cSadOncq1TXJycrmPU9kWLVrE4MGDQx2GcQXjKqBMIKGY5dtx+gMCKj1rH57trUi9YC6e5aPoEdvYkkCYady4MWvWrAFg0qRJ1K1bl9///vfs3LkzIF9GeXl51KhR/J/WW2+9xeDBg32J59FHH63045ckPT09aMcyVUO1vhPY2+Y/+fIsJjSdzuSRCYX6BIzJz8/ntttuo2PHjgwaNIgjR44AkJWVxdVXX023bt3o3bs3mzdvBpz/vPv3709cXBwDBgzgm2++AWDcuHHceeedXHbZZTzwwAPFbp+ens4777zD/fffT3x8PFlZWYwbN465c+cCsHLlSpKTk+nSpQtJSUkcOnSInTt30rt3b7p27UrXrl3L9CX+xBNP0L17d+Li4vjzn//sW163bl0ACgoKuPvuu2nXrh0DBw7k2muv9cWwatUq+vbtS7du3bjqqqvIzs4GoF+/fjz44IMkJSXRtm1bPv/8cwB69OjBhg0bfMfo168fGRkZrFixgp49e5KQkEBycjJbtmw5Jc5Jkybx5JNP+sqdOnVi586dAHg8HpKSkoiPj+eOO+4gPz+f/Px8xo0bR6dOnejcuTNPP/10GT5hU5oqNRZQeWXuynXa/I+uhBxIbl2PyaMSyNyVa7WAUFl1H/y4pnL3eX48dPu/Cm26detWXnvtNV544QWGDx/OG2+8QUpKCrfffjtTp06lTZs2LF++nLvvvptPP/2Ue++9l7FjxzJ27FheeuklUlNTeeuttwDnctf09HQiIyMZMGBAsdvfcMMNDB48mKFDhxaK4/jx44wYMYLZs2fTvXt3Dh48SJ06dWjatCmffPIJtWvXZuvWrYwcObLU8bA+/vhjtm7dyooVK1BVbrjhBj777DP69OnjW2fevHns3LmTjRs3snfvXtq3b8+tt97KiRMnuPfee3n77beJiopi9uzZ/OEPf+Cll14CnJrNihUr+OCDD3jkkUeYP38+I0aM4PXXX+eRRx4hOzub7OxsEhMTOXjwIJ9//jk1atRg/vz5TJw4kTfeeKNMn8mmTZuYPXs2S5YsoWbNmtx9993MnDmTjh07snv3btavXw/AgQMHyvFJm+JU6wRwZ99Y58nmOs7P/CMkxzaxL3/j07p1a+Lj4wHo1q0bO3fu5PDhw6SnpzNs2DDfeseOHQNg6dKlzJs3D4AxY8bwwAMP+NYZNmwYkZGRpW5fki1bttC8eXO6d+8OQP369QH46aefGD9+PGvWrCEyMpKvvvqq1P18/PHHfPzxxyQkOK2uhw8fZuvWrYUSwBdffMGwYcOIiIjgggsu4IorrvDFsH79egYOHAg4taPmzZv7tvvlL39Z6DwBDB8+nEGDBvHII4/w+uuv+xJbbm4uY8eOZevWrYgIJ06cKDVufwsWLGDVqlW+c3HkyBGaNm3K9ddfz/bt27n33nu57rrrGDRoUJn3aYpXrROAT+TJBAANQxmJqeB/6oFSq1Yt3/PIyEiOHDlCQUEBDRs29PUblNV5550HUOHti/P000/TrFkz1q5dS0FBAbVr1y51fVXl4Ycf5o477ij3sVSVjh07snTp0mJf956ryMhI8vKcezhbtGhB48aNyczMZPbs2UydOhWAP/7xj1xxxRW8+eab7Ny5k379+p2yvxo1alBQUOAre69fV1XGjh3L3/72t1O2Wbt2LR999BFTp07l9ddf99VOTMVU6z4An0j3jybfhiIwp1e/fn1at27NnDlzAOcLae3atYBzJc2sWbMAmDlzJr179y7X9vXq1ePQoUOnbHPppZeSnZ3NypUrATh06BB5eXnk5ubSvHlzIiIieOWVV8jPzy819quuuoqXXnqJw4ed0Vd2797N3r17C63Tq1cv3njjDQoKCtizZw+LFi3yxZCTk+NLACdOnCjUvl+SESNG8I9//IPc3Fzi4uIApwbQooVzc//06dOL3S4mJoYvv/wSgC+//JIdO3YAMGDAAObOneuL+4cffuDrr79m3759FBQUMGTIEB577DHftqbiwiQB+NcAjDm9mTNn8uKLL9KlSxc6duzI2287t6n8+9//Ztq0acTFxfHKK6/wr3/9q1zb33zzzTzxxBMkJCSQlXXyjvRzzjmH2bNnc++999KlSxcGDhzI0aNHufvuu5kxYwZdunRh8+bNvlpGSQYNGsSoUaPo2bMnnTt3ZujQoacknCFDhhAdHU2HDh1ISUmha9euNGjQgHPOOYe5c+fy4IMP0qVLF+Lj48vU6Tx06FBmzZrF8OHDfcseeOABHn74YRISEny1haKGDBnCDz/8QMeOHZk8eTJt27YFoEOHDjz22GMMGjSIuLg4Bg4cSHZ2Nrt376Zfv37Ex8eTkpJSbA3BlI84Y7VVDYmJiVqhCWF2vQ2f3QhXr4JGXSs9LlO6TZs20b59+1CHYfwcPnyYunXrsn//fpKSkliyZAkXXHBBqMMylaC4vzcRWaWqiUXXDcM+AGPM4MGDOXDgAMePH+ePf/yjffmHKUsAxoQhb7u/CW9h0gdgncDGGFNUmCQAqwEYY0xRYZIArAZgjDFFhUkCsBqAMcYUFSYJwK0B5FkCCFeRkZG+IaHj4+N5/PHHAfjNb35TaHjmUPEO1FadFR0Ku6wqem6uvfZaDhw4wIEDB3j22Wd9y8s6JPW4ceN8Q4V07dq1xDukQ2H69OmMHz/+jPcTJgnArQEUWBPQ2S5Q03jWqVOHNWvW+B4PPfQQAP/5z3+CPidAuKpoAqioDz74gIYNG56SAMrjiSeeYM2aNTz++OPlGl7jdHdsny3CJAFYDaCqCPY0nt7hiwFefPFF2rZtS1JSErfddpvvP6ycnByGDBlC9+7d6d69O0uWLAGc4YxvvfVW+vXrx8UXX0xaWhoADz30EM8884zvGN5hjw8fPsyAAQPo2rUrnTt39t0d7K/of6fjx4/3DaVQ0lDNaWlpdOjQgbi4OG6++eZT9pmfn8/vf/97OnXqRFxcHP/+978BZ9C1hIQEOnfuzK233uobsC4mJoaHH36Y+Ph4EhMT+fLLL7nqqquIjY31jfWzaNEi+vTpw3XXXcell17KnXfe6RvXx/8/9rlz5zJu3Lhih8IuacjtHTt2+O5k/t///d9iP7cnnnjCd77/53/+h/79+wPw6aefMnr0aN/72LdvHw899BBZWVnEx8dz//33A86NcEOHDqVdu3aMHj2a090Q26dPH7Zt2wYUP1S1933/7ne/o0uXLixdupSXX36ZuLg4unTpwpgxY4Dif5cKCgqIiYkpNLppmzZt2LNnD++++y6XXXYZCQkJXHnllezZs6fUOMtNVavMo1u3blphr52juvrBim9vKmzjxo3lWn/JthxNePRj/edHmzXh0Y91ybacM44hIiJCu3Tp4nvMmjVLVVX79u2rK1eu1N27d+tFF12k+/fv1+PHj+vll1+u99xzj6qqjhw5Uj///HNVVf3666+1Xbt2qqr65z//WXv27KlHjx7VnJwcbdSokR4/fly//PJL7dOnj+/Y7du312+++UZPnDihubm5qqqak5OjsbGxWlBQoKqq5513nqqqLly4UK+77jrftvfcc49OmzZNjx8/rj179tS9e/eqquqsWbP0lltuUVXV5s2b69GjR1VV9ccffzzlvT/77LM6ZMgQPXHihKqq7t+/X48cOaLR0dG6ZcsWVVUdM2aMPv3006qqetFFF+mzzz6rqqr33Xefdu7cWQ8ePKh79+7Vpk2b+uKsVauWZmVlaV5enl555ZU6Z86cQu9FVXXOnDk6duxYVVUdO3asbx1V1f79++tXX32lqqrLli3TK664QlVVr7/+ep0xY4aqqk6ePLnQ/ryWLl2qQ4cOVVXVyy+/XLt3767Hjx/XSZMm6dSpU33vIycnR3fs2KEdO3b0bbtw4UKtX7++fvvtt5qfn689evTwfb7+/ON9/fXXNSkpSTdu3KiDBw/W48ePq6rqXXfd5YsV0NmzZ6uq6vr167VNmzaak5PjO+eqJf8upaam6ksvveQ7FwMGDFBV1R9++MH3O/LCCy/ohAkTVFV12rRpvt/Poor7ewMytJjv1PC4EQycZiCrAVQJybFNSLmsFWmfbiO1/yWVMny3twmoJCtWrKBv3740atQIcIZ29g69PH/+/EJNFwcPHvQNtnbddddRq1YtatWqRdOmTdmzZw8JCQns3buX7777jpycHM4//3xatmzJiRMnmDhxIp999hkRERHs3r2bPXv2lOku3NKGao6Li2P06NHceOON3HjjjadsO3/+fO68807fLGWNGjVi7dq1tG7d2jf+ztixY3nmmWe47777ALjhhhsA6Ny5M4cPH6ZevXrUq1ePWrVq+f5TTUpK4uKLLwZg5MiRfPHFF6fMc1CS0obMXrJkiW/ugDFjxvDggw+esn23bt1YtWoVBw8epFatWnTt2pWMjAw+//xzX82gNElJSURHRwMQHx/Pzp07ufzyy09Z7/777+exxx4jKiqKF198scShqsHpZxoyZAjg1ESGDRtGkybO767396qk36URI0bw6KOPcssttzBr1ixGjBgBOHNMjBgxguzsbI4fP07r1q1P+97KI4wSQG3rA6gi0rP24Vn+Dan9L8Gz/JuQT+NZUFDAsmXLih2Kuehw0t6Bz4YNG8bcuXP5/vvvfX/MM2fOJCcnh1WrVlGzZk1iYmJ8QyB7lTZEcklDNb///vt89tlnvPvuu/zlL39h3bp1JU5JWVbe9xUREVHoPUZERPjeo4gU2sZb9l9e9P15nW7I7KL7LqpmzZq0bt2a6dOnk5ycTFxcHAsXLmTbtm1lGneqpM+tqCeeeKJQUlu4cGGJQ1XXrl2byMjIUo9b0u9Sz5492bZtGzk5Obz11lu+pq97772XCRMmcMMNN7Bo0SImTZp02vdWHgHvAxCRliKyUEQ2isgGEfmtu3ySiOwWkTXu49qABmI1gCrBN43nqAQmDLqUyaOCM41n9+7dWbx4MT/++CN5eXmFZq8aNGiQr90cKNM4/yNGjGDWrFnMnTvX919ubm4uTZs2pWbNmixcuJCvv/76lO0uuugiNm7cyLFjxzhw4AALFiwASh6quaCggG+//ZYrrriCv//97+Tm5vpqJ14DBw7kueee833J/fDDD1x66aXs3LnT1679yiuv0Ldv33KcMafWtGPHDgoKCpg9e7bvP+hmzZqxadMmCgoKePPNN33r+w+FXdqQ2b169So05HZJevfuzZNPPkmfPn3o3bs3U6dOJSEh4ZTkUdIQ3BVR0lDVRfXv3585c+awf/9+33pQ8u+SiHDTTTcxYcIE2rdvT+PGjYHCw2rPmDGjUt6Dv2B0AucBv1PVDkAP4B4R8V528bSqxruPDwIaRWQduw+gCvBN4+n+x58c28Q3jeeZOHLkSKHLQL1XAXm1aNGCiRMnkpSURK9evYiJiaFBA6fjOS0tjYyMDOLi4ujQoYOvI7Q0HTt25NChQ7Ro0cLXVDN69GgyMjLo3LkzL7/8Mu3atTtlu5YtWzJ8+HA6derE8OHDfTN7lTRUc35+PikpKXTu3JmEhARSU1Np2LBhoX3+5je/oVWrVr4OyVdffZXatWszbdo0hg0bRufOnYmIiODOO+8s1znt3r0748ePp3379rRu3ZqbbroJgMcff5zBgweTnJxcaEaxokNhlzRk9r/+9S+eeeYZOnfuzO7du0s8fu/evcnOzqZnz540a9aM2rVrFzs/Q+PGjenVqxedOnXydQJXVElDVRfVsWNH/vCHP9C3b1+6dOnChAkTgNJ/l0aMGIHH4/HVGMG5gGDYsGF069bN15xUmYI+HLSIvA1MBnoBh1X1ydNs4lPh4aAB/tsV6rSAfu9WbHtTYVVlOGjvEMl5eXncdNNN3Hrrrb4vNVPYokWLePLJJ3nvvfdCHYopojzDQQf1MlARiQESgOXuovEikikiL4nI+SVsc7uIZIhIRk5OTsUPbjUAcxqTJk0iPj6eTp060bp162I7VI2pToJWAxCRusBi4C+qOk9EmgH7AAX+H9BcVW8tbR9nVANYMAAKjsHALyq2vamwqlIDMKY6OOtqACJSE3gDmKmq8wBUdY+q5qtqAfACkBTQIKwTOKSC3dRoTDgq799ZMK4CEuBFYJOqPuW3vLnfajcB6wMaiDUBhUzt2rXZv3+/JQFjAkhV2b9/f7GXK5ckGPcB9ALGAOtEZI27bCIwUkTicZqAdgJlH2ijIiJr23DQIRIdHc2uXbs4oz4cY8xp1a5d23eDW1kEPAGo6hdAcXd1BPayz6KsBhAy3pt2jDFnl/AYDA6sBmCMMUWEUQKwGoAxxvgLowRQ27kMVAtOv64xxoSBMEoA3mkhj4U2DmOMOUuEYQKwZiBjjIGwSgDutbHWEWyMMUBYJQCrARhjjL8wSgDeGoAlAGOMgbBKAN4agDUBGWMMhFMCqGFNQMYY4y98EkCEdQIbY4y/8EkAVgMwxphCwicBRFgnsDHG+AufBFDDOoGNMcZf+CQAqwEYY0wh4ZMArAZgjDGFhE8CsDuBjTGmkPBJABG1nJ9WAzDGGCCcEoCIOyuY1QCMMQaCkABEpKWILBSRjSKyQUR+6y5vJCKfiMhW9+f5gY6FCEsAxhjjFYwaQB7wO1XtAPQA7hGRDsBDwAJVbQMscMuBVaOONQEZY4wr4AlAVbNV9Uv3+SFgE9AC+AUww11tBnBjoGOxeYGNMeakoPYBiEgMkAAsB5qparb70vdAs4AHEFnbagDGGOMKWgIQkbrAG8B9qnrQ/zVVVUBL2O52EckQkYycnJwzC8JqAMYY4xOUBCAiNXG+/Geq6jx38R4Rae6+3hzYW9y2qvq8qiaqamJUVNSZBWJXARljjE8wrgIS4EVgk6o+5ffSO8BY9/lY4O1Ax+LUAKwJyBhjAGoE4Ri9gDHAOhFZ4y6bCDwOvC4ivwa+BoYHPJLIOnBsX8APY4wxVUHAE4CqfgFICS8PCPTxC7FOYGOM8QmfO4HBOoGNMcZPmCUA6wQ2xhivMEsA1glsjDFeYZYArAZgjDFep+0EFpGmOFfyXAgcAdYDGapaEODYKl9kHSg4AQX5EBEZ6miMMSakSkwAInIFzgBtjYDVODdq1cYZsydWROYC/yx6V+9ZzTspTMFRiDgvtLEYY0yIlVYDuBa4TVW/KfqCiNQABgMDce7wrRoi3XmB845ADUsAxpjwVmICUNX7S3ktD3grEAEFlH8NwBhjwlxpTUATStuwyLAOVYN/DcAYY8JcaU1A9YIWRbBYDcAYY3xKawJ6JJiBBIU3AVgNwBhjTn8fgIhEi8ibIrLXfbwhItHBCK7SeZuA7F4AY4wp041g03CGbr7QfbzrLqt6vDUAuxvYGGPKlACiVHWaqua5j+nAGc7MEiJWAzDGGJ+yJID9IpIiIpHuIwXYH+jAAsJqAMYY41OWBHArzmQt3wPZwFDglkAGFTC+BGA1AGOMOe1YQKr6NXBDEGIJPG8TkF0GaowxZRoMrjVwLxDjv76qVr2kYJeBGmOMT1mmhHwLZ1L3d4GqNwKoP+sENsYYn7IkgKOqmhbwSIIh4hxArBPYGGMoWyfwv0TkzyLSU0S6eh9lPYCIvOTeQLbeb9kkEdktImvcx7UVir68RGxSGGOMcZWlBtAZGAP052QTkLrlspgOTAZeLrL8aVV9soz7qDw2LaQxxgBlSwDDgItV9XhFDqCqn4lITEW2DYjIOlYDMMYYytYEtB5oGIBjjxeRTLeJ6PySVhKR20UkQ0QycnJyzvyo1gRkjDFA2RJAQ2CziHwkIu94H2d43ClALBCPc3PZP0taUVWfV9VEVU2MiqqEESisCcgYY4CyNQH9ubIPqqp7vM9F5AXgvco+RomsBmCMMUDpM4J9BHwI/FdVN1fmQUWkuapmu8WbcJqZgsNqAMYYA5ReAxgLXA1MEpG2wHKchDBfVX8q6wFE5DWgH9BERHbh1Cj6iUg8ztVEO4E7KhJ8hUTWgRO5QTucMcacrUqbEex7nEs4p4tIBHAZcA3wgIgcAT5W1X+c7gCqOrKYxS9WLNxKEFkbjn4fssMbY8zZoix9AKhqAbDUffxJRJoAVwUysICxJiBjjAFK7wP4N04TTXGOAVkiUk9VDwUkskCxTmBjjAFKrwFknGa7jsA8YGClRhRoVgMwxhig9D6AGafbWEQ+qNxwgsDuBDbGGKD0JqBSb/ZS1RtUNTiDuFUmawIyxhig9CagnsC3wGs4l4BKUCIKtMg6oPlQkAcRZeoDN8aYaqm0b8ALcNr3RwKjgPeB11R1QzACCxj/SWEi6oU2FmOMCaESxwJS1XxV/VBVxwI9gG3AIhEZH7ToAsE3Mbx1BBtjwlupbSAiUgu4DqcWEAOkAW8GPqwAsmkhjTEGKL0T+GWgE/AB8IiqBm+8nkCyGoAxxgCl1wBSgJ+A3wKpIr4+YAFUVesHOLbAqOFNAFYDMMaEt9LuAyjLXAFVT4Q1ARljDJTSCSwidU+3cVnWOevUsCYgY4yB0mcEe1tE/ikifUTkPO9CEblYRH7tzhdwdeBDrGRWAzDGGKD0JqABInItzlj9vdx5e/OALTj3BIx1h4yuWqwGYIwxwGkuA1XVD3CuAqo+Iq0T2BhjoGyTwlcvdh+AMcYAYZkArAnIGGMgLBOA1QCMMQbKkADcK4E6VvQAIvKSiOwVkfV+yxqJyCcistX9eX5F919uVgMwxhigbDWATcDzIrJcRO4UkQblPMZ0Tr1c9CFggaq2ARa45eCIqAkSaTUAY0zYO20CUNX/qGov4Fc4A8JlisirInJFWQ6gqp8BPxRZ/AvAO+PYDODGsgZcKSJrQ54lAGNMeCtTH4CIRALt3Mc+YC0wQURmVfC4zVQ1233+PdCslGPfLiIZIpKRk5NTwcMVEVkHCqwJyBgT3srSB/A0zs1f1wJ/VdVuqvp3Vb0eSDjTAFRVAS3l9edVNVFVE6Oios70cA6bFtIYY0q/EcyVCfyvqv5UzGtJFTzuHhFprqrZItIc2FvB/VRMZB3rBDbGhL2yJIC1wKV+w0ED5AJfq2puBY/7DjAWeNz9+XYF91MxVgMwxpgy9QE8CywDngdeAJYCc4AtIjLodBuLyGvuNpeKyC4R+TXOF/9AEdkKXOmWA27q4izSs/Y5NQC3Ezg9ax9TF2cF4/DGGHNWKUsC+A5IcNvhu+G0+2/HmTD+H6fbWFVHqmpzVa2pqtGq+qKq7lfVAaraRlWvVNWiVwkFRFx0A8a/upr03LZQcJT0rH2Mf3U1cdHlvbLVGGOqvrI0AbVV1Q3egqpuFJF2qrq9SLPQWS85tgmTRyUwfnouKReuwLN0NZNHJZAc2yTUoRljTNCVJQFsFJEpgPeSzxHuslrAiYBFFiDJsU1IuWgzadv6ktq/lX35G2PCVlmagMYC24D73Md2YBzOl3+ZbgY7m6Rn7cPzTQdSm7+JZ/k3Tp+AMcaEoVJrAO4NYB+o6hXAP4tZ5XBAogoQb5v/5L67SN7zIj2uecQpWzOQMSYMlVoDUNV8oKAC4/+clTJ35Tpf9q0bApB8wc9MHpVA5q6KXs1qjDFVV1n6AA4D60TkE8B3M5iqpgYsqgC5s2+s8+T7Fs7PI7tIjm1j//0bY8JSWRLAPPdRfdRxE8DPu0MbhzHGhNBpE4CqzhCROkArVd0ShJgC71xvDcASgDEmfJVlMLjrgTXAh245XkTeCXBcgVWzHtSsbzUAY0xYK8tloJNwBn07AKCqa4CLAxZRsNRpAT/vCnUUxhgTMmVJACeKGfStIBDBBNW50dYEZIwJa2VJABtEZBQQKSJtROTfQHqA4wq8c1tYE5AxJqyVJQHcC3QEjgGvAQdx7giu2uq0gKPZUJAX6kiMMSYkynIV0M/AH9xH9XFuC9ACOLrn5FVBxhgTRk6bAESkLfB7nAnhfeurav/AhRUEdaKdnz/vtgRgjAlLZbkRbA4wFfgPkB/YcILI7gUwxoS5siSAPFWdEvBIgs13N7BdCmqMCU9l6QR+V0TuFpHmItLI+wh4ZIFWOwoialoNwBgTtspSAxjr/rzfb5lS1W8Gkwioc6FdCmqMCVtluQqodaAOLiI7gUM4fQt5qpoYqGMVy+4GNsaEsRKbgETkAb/nw4q89tdKjOEKVY0P+pc/OB3B1gRkjAlTpfUB3Oz3/OEir10dgFiCr0600wSkGupIjDEm6EpLAFLC8+LKFaXAxyKySkRuLzYIkdtFJENEMnJycirpsK5zW0D+z3DCZgQzxoSf0hKAlvC8uHJFXa6qXYFrgHtEpM8pQag+r6qJqpoYFRVVSYd12aWgxpgwVloC6CIiB0XkEBDnPveWO1fGwVV1t/tzL/AmzrDTwXOuzQxmjAlfJV4FpKqRgTywiJwHRKjqIff5IODRQB7zFOe6w0FYR7AxJgyV5T6AQGkGvCki3jheVdUPgxpBnQudn1YDMMaEoZAlAFXdDnQJ1fEBiKwFtZrAEesDMMaEn7IMBVG9nRttNQBjTFiyBFDHbgYzxoQnSwDn2nAQxpjwZAmgTgs4tg/yj4U6EmOMCSpLAL5LQb8LbRzGGBNklgDq2M1gxpjwZAngXBsOwhgTnsI6AUxdnEX693WdgnslUHrWPqYuzgphVMYYExxhnQDiohswfs5W0n/uDj/vJj1rH+NfXU1cdINQh2aMMQEXyqEgQi45tgmTRyUwftrvSJEsPN+tZvKoBJJjm4Q6NGOMCbiwrgGAkwRSLtpE2tYupFzWyr78jTFhI+wTQHrWPjy74klt+hqeZTtJz9oX6pCMMSYowjoBeNv8Jw8+jwkXzGTyVQWMf3W1JQFjTFgI6wSQuSvXafOP7wkSQXKdpUwelUDmLpsi0hhT/YV1J/CdfWNPFhp2gZx0kuMetX4AY0xYCOsaQCFRvWD/cijIC3UkxhgTFJYAvJokQ95hyF0f6kiMMSYoLAF4RSU7P3PSQxuHMcYEiSUAr3NbOXME5ywJdSTGGBMUIU0AInK1iGwRkW0i8lAoY0HEaQbaZzUAY0x4CFkCEJFI4BngGqADMFJEOoQqHsBpBvppJ/xscwMYY6q/UNYAkoBtqrpdVY8Ds4BfhDAepwYAsG9pSMMwxphgCGUCaAF861fe5S4LnfMTIKKWNQMZY8LCWd8JLCK3i0iGiGTk5OQE9mCR50Dj7nYlkDEmLIQyAewGWvqVo91lhajq86qaqKqJUVFRAQ1o6uIs0vOvgR9XQf5RwCaIMcZUX6FMACuBNiLSWkTOAW4G3glhPM4EMcviSD/YDn5YZRPEGGOqtZCNBaSqeSIyHvgIiAReUtUNoYoH3AliRrRjvOchUj7ZiifrZ5sgxhhTbYW0D0BVP1DVtqoaq6p/CWUsXsntLyHlwhWkZUbZBDHGmGrtrO8EDrb0rH149l7hTBCzdLvNDWCMqbYsAfjxTRBzcycmXPg6k7svtwlijDHVliUAP74JYtrHQsuhJP/0f0we0cEmiDHGVEuWAPzc2Tf2ZJv/JXfAiVySa3xSeOIYY4ypJiwBlKRpH6jfDrZODXUkxhgTEJYASiICl9zpzBL245pQR2OMMZXOEkAppu4eQPrP3WDrc75ldmewMaa6sARQiriYCxj/zUTS130JJw7ZncHGmGolZHcCVwXJsU2Y/IsmjJ/3W1Lmvo1nWzO7M9gYU21YDeA0krv2JqXletLWnk9Kt0b25W+MqTYsAZxG+vb9ePb0IfWCOXiW7SB9m90UZoypHiwBlMJ3Z3BKIhMGdWRy9KOM9yyzO4ONMdWCJYBS+O4Mjm0C7SaQyQDuinqNzB0n5wy2q4KMMVWVJYBSFLozOCKSuMtGM+W764j76SUAuyrIGFOl2VVA5ZDcJZHJOV8wfmESKcfm4NnS0K4KMsZUWVYDKKfk/veQ0moTaV+eS8qlufblb4ypsiwBlFP6jlw8e3qT2noZL6yGF96aXfh16xMwxlQRlgDKwXdV0OiuTPj1w0xos5y/LjvXlwSsT8AYU5VYH0A5FLoqCLjtV4/Cy5N4ankSi3bMJPNAY577VaLv9fSsfWTuyrXhpI0xZyWrAZRDoauCAGrU4bZfTeK2tjtYsqchJ04cgYNfAVYbMMac/UKSAERkkojsFpE17uPaUMRRGdK//gnPri6kdoea5HHHnF089cpz/Hr6Su7qd3GhhGH9A8aYs0koawBPq2q8+/gghHFUmK9PYFQCE4Zcx3O/6s4JapG2IZqr6y1myvx1pG90agQPz8vkjldWFaoRWEIwxoSSNQGdgaJ9AtSsS81zapPcqiaLD3fnrsYzGD8zg6emPcl7a74ttK0lBGNMqIWyE3i8iPwKyAB+p6o/FreSiNwO3A7QqlWrIIZ3ev6du97awHNjupEc28QpzzyPvhd+TdqW9qQ2fY0eDXcwfsYEUuIieW9dLZCT+ffheZm8l5nNc2O6ATB1cRaREZBfcPI44dipPHVxFnHRDXxJtuh5CWYZ8CXszF25ACGLxWILz1ihcr8HAlYDEJH5IrK+mMcvgClALBAPZAP/LGk/qvq8qiaqamJUVFSgwj1jRWsDybFNuOuKNnz4/UWk9rsIz8GboUlPUhr/l7SMmtzSYCbPXfxPxs9YzFOvzuC91d+CFkCB81sYGQF/fX8zke4nVLTGMHVxFi98nuWrMZSnPHVxFulZ+3w1jjPZV2WXi8YWF92AO15ZxcPzMos9L8Ese2Pxfg6hjMViC89YK/vikoDVAFT1yrKsJyIvAO8FKo5gKZqN07P2MWXRdl4c51wW2qPNBdzxSk0AUnvUwLN6GD1azyclaj5pmYOdGkLdTMZPf4iU5svx7LmciR03M2X+CQ7tWsJ7G8935ik+sAEONCbyxFH+On8PE6+JBS3w/aJMvK4dQKnljhc6v+QAz43pxobvcsu8bbFlccvXtIG8n4nU4/z1/e1MvKoVHN1LZP4h/vrf3UwceAEc3kHk8f38dUEOEwc0hgNHiTz6I39dmMvEfnXp2KwGd7y8BVR57obz4MevoSCP99Z8S5R8hyczn4mXC1MWbObQ3s141ikTexUwZcEmDu3ZgGd9BBOTTzjl7zPxbKjBxJ7HmLJgI4eyV+PZWIuJPX52y6vwbKzDxMsOO+XvMvBs8pY3cGj3Cjybz2Ni0kGmLNhASrvDkF8XEJat/AjP5npMTMp11t21FM/m+kzs/iNT5m/g0K50PJsbMLH7D0yZn3+ynOgtL3HLPzJlfp5f+Yfiy99+gWdLQyYm7i+2nHLpAcg/H4Bly98vdd3Tlz/Hs+V8Jibuq5RyyqU/Qn4jN7b3KnXfYRVr7j48qw9W6vAzIWkCEpHmqprtFm8C1ocijkA6pX/ANTiuORNujKNH533c8UptAFL7NMWzchQ9ul9FSu0DpG0cRGrM59xWfxaHGvYlbe3wkwli3kOkNH4Bz/5rmdj8daZ8PJxDqx5zyi3eZspHN3Jo9RN49vZj4kUfMeWjqzm09l94vu/FxJgFTPnoMCnNl8Lxy0Fg2Yf/D092MhNjPmHKRwM5tPb/nHVbfehs691Xy3eY8tH1HFr1Fzz7BjLxwjeY8uEvOZQxCc++a/xiefRkbPOHc2j130+WPx3OobUfnCwvGs6hdX7lz4eT0vgDOHE9AMs+ew3P/mt57qLHWXY4jrTlI0lt+hq3HZzJofqjSVs5ktSms7jtkFvOcF8/7JZXueWf3PKXbvnnIuUjbnl1kfIat3y0cBk49bW1bvnYTA41KKV8vILlzLKVgTKvG+zy2RxblYj1i5Gk9r+kUoefEVWttJ2V+aAir+A0/yiwE7jDLyGUKDExUTMyMgIbXIAUbctOz9rHHa+sYnBcc/72yzhfGeCW5Bg8y7/hrn4XM2VRFimJzfCszGby9fVZtuMAaSuU1K4/MaHLXp7KOJe0dc1I7fgNEzps5al1rUjb3IbUSzcxod06ntrYnrStnUltk8mES9fw1OY40rbFk9pmLQBpW7s4r7Vb57y2tTOpbTcwocMmntrUibQt7Uht9xUTOmbx1Ma2pG2KJbXDTiZ0/oan1rcmbUNLUjvtZkKXPTyVeSFp6y4gNS6HCV1/5KnVTUhb24jU+FwmJP7EU6vqk7a6LqldjzCh+zGeyqhD2qpapCbmMeEy5akVkaStjCA1CUCc93lZDXq0rMH494+RElcTT+YJ7kqqzZQVR0npUgfP2iPcdVldpiz/iZSE8/Cs/om7ejZgytJcUrrWx/PlQe5KPp8p6QdI6doAz+pc7urZiClLfyClayM8X/7AXb2aMGXJPlK6Ncazaj939WrGlCV7SOkWhWfVPu66vBlTvthDSmIU05bvAYRbLmuGJ2Mvd13enClfZJOS2LRwuXszPCv3cFfvFkz5fLdfOZopn+8ipfsFeFZ+71dujmdldsnlpOZ4VmRzV5+WTPns22LL05budmLreSGeFd+Xum6wy05scEvPFiGPpcrGellLPCt2VagGICKrVDWx6PKQ1ABUdUwojhtKRZuIMnfl+jqM/Q2Oa86EQZdSr04NXzPLbb1j6dG2hZsgIknt7ySIes274dm+ndT+rfAsP4d6MYPwfOtXvuQmPN/5ldsOx5PtlKelOx+9sy/3Nf912wzBs8uvHHsDnm/8yq2vxrPTr3zRgMKxtOyNZ5u3/A31WlyG5yu/cvOL8Wz2Kze7GM9Gb2w7fbFNS9/JtLV5PDcmieTYJtRrklXovNRrXKR8fpFyw9OUGxQp1y+53PHCBkxbkQNAj0tbUq9e/cLr1iuybd3TlesWKZ9Xevm8kssdL2zAtGXO/1A92lxYzLrnhqzsxPadG1vzkMZS1WPtcUmU79LzyqgJ2FAQIXK6hJBfABOva+e7MsGrpARRnnLHCxv4vmR7xDY+o31VdrlobDmHj/Fe5snKYdHzEsyy9zPyfl4QulgstvCMNTm2CZNHJZC5q3JGIg5JE1BFVeUmoDNVmZdDwtl7qVvR2O7sGxuWl78aU5lKagKyBGCMMdVcSQkgYPcBGGOMObtZAjDGmDBlCcAYY8KUJQBjjAlTlgCMMSZMVamrgEQkB/i6jKs3AfYFMJwzYbFVjMVWMRZbxVSn2C5S1VNG06xSCaA8RCSjuMuezgYWW8VYbBVjsVVMOMRmTUDGGBOmLAEYY0yYqs4J4PlQB1AKi61iLLaKsdgqptrHVm37AIwxxpSuOtcAjDHGlMISgDHGhKlqmQBE5GoR2SIi20TkobMgnp0isk5E1ohIhruskYh8IiJb3Z/nBymWl0Rkr4is91tWbCziSHPPY6aIdA1BbJNEZLd77taIyLV+rz3sxrZFRK4KcGwtRWShiGwUkQ0i8lt3ecjPXSmxhfzciUhtEVkhImvd2B5xl7cWkeVuDLNF5Bx3eS23vM19PSYEsU0XkR1+5y3eXR7sv4dIEVktIu+55co/Z6parR5AJJAFXAycA6wFOoQ4pp1AkyLL/gE85D5/CPh7kGLpA3QF1p8uFuBa4L+AAD2A5SGIbRLw+2LW7eB+trWA1u5nHhnA2JoDXd3n9YCv3BhCfu5KiS3k5859/3Xd5zWB5e75eB242V0+FbjLfX43MNV9fjMwO4DnraTYpgNDi1k/2H8PE4BXgffccqWfs+pYA0gCtqnqdlU9DswCfhHimIrzC2CG+3wGcGMwDqqqnwE/lDGWXwAvq2MZ0FBEmgc5tpL8ApilqsdUdQewDeezD1Rs2ar6pfv8ELAJaMFZcO5Kia0kQTt37vs/7BZrug8F+gNz3eVFz5v3fM4FBoiIBDm2kgTtMxWRaOA64D9uWQjAOauOCaAF8K1feRel/zEEgwIfi8gqEbndXdZMVb1zHX4PNAtNaKXGcracy/Fulfslv6aykMXmVrETcP5jPKvOXZHY4Cw4d25TxhpgL/AJTo3jgKrmFXN8X2zu67lA42DFpqre8/YX97w9LSK1isZWTNyV7f+ABwDvpLCNCcA5q44J4Gx0uap2Ba4B7hGRPv4vqlN3Oyuuxz2bYnFNAWKBeCAb+GcogxGRusAbwH2qetD/tVCfu2JiOyvOnarmq2o8EI1T02gXijiKUzQ2EekEPIwTY3egEfBgMGMSkcHAXlVdFehjVccEsBto6VeOdpeFjKrudn/uBd7E+SPY460+uj/3hi7CEmMJ+blU1T3uH2kB8AInmyqCHpuI1MT5gp2pqvPcxWfFuSsutrPp3LnxHAAWAj1xmk9qFHN8X2zu6w2A/UGM7Wq3SU1V9RgwjeCft17ADSKyE6cJuz/wLwJwzqpjAlgJtHF7zM/B6RR5J1TBiMh5IlLP+xwYBKx3YxrrrjYWeDs0EUIpsbwD/Mq9+qEHkOvX3BEURdpYb8I5d97YbnavgGgNtAFWBDAOAV4ENqnqU34vhfzclRTb2XDuRCRKRBq6z+sAA3H6KBYCQ93Vip437/kcCnzq1qyCFdtmv4QuOO3s/uct4J+pqj6sqtGqGoPz/fWpqo4mEOcsUD3YoXzg9NZ/hdPW+IcQx3IxzhUXa4EN3nhw2ugWAFuB+UCjIMXzGk5zwAmcdsRflxQLztUOz7jncR2QGILYXnGPnen+ojf3W/8PbmxbgGsCHNvlOM07mcAa93Ht2XDuSokt5OcOiANWuzGsB/7k93exAqcDeg5Qy11e2y1vc1+/OASxfeqet/WAh5NXCgX178E9Zj9OXgVU6efMhoIwxpgwVR2bgIwxxpSBJQBjjAlTlgCMMSZMWQIwxpgwZQnAGGPClCUAU+lE5EYRURFp57csXvxGo6yEY/xHRDpU1v6Coeg5EJEbpJJGqxWRfHfkyvUi8q73+vZi1qsjIotFJLISjtlZRKaf6X5M6FgCMIEwEvjC/ekVj3NteqVQ1d+o6sbK2l9l8btTszjx+J0DVX1HVR+vpEMfUdV4Ve2EM6DePSWsdyswT1Xzz/SAqroOiBaRVme6LxMalgBMpXLHo7kc5yaum91l5wCPAiPc/1JHiDOO/lvugFvLRCTOXXeSiMwQkc9F5GsR+aWI/EOc+RQ+dIc8QEQWiUii+/xqEflSnHHdFxQTU0dxxn1f4x6vjbs8xW/5c97/ikXksDsI2AYRWSAiUe7y20RkpXucN0TkXHf5dBGZKiLLgX+ISJKILBVnLPd0Ebm0hHMwTkQmu/uIEZFP3fgWeL9U3X2nufvZLiJDi76/Yiyl5EHKRuPeQSoi/UTkMxF5X5x5AaaKSITfOXjCPQfz3fe0yI3hBr/9vev9nE0VFOg72ewRXg+cL5gX3efpQDf3+Thgst96/wb+7D7vD6xxn0/CqT3UBLoAP+PeqYozjtKN7vNFQCIQhTMSYmt3+Sl3VLvHGu0+PweoA7TH+fKq6S5/FviV+1z91v+TN26gsd8+HwPudZ9PB97DHVMfqA/UcJ9fCbxRwjkY57fvd4Gx7vNbgbf89j0H55+1DjhDnRd33g+7PyPd9a8uZp1zgO/9yv2Aozh3mEbijNQ51O8c+J/3j/0+kzV+++gFvBvq3zt7VOxRWnXVmIoYiTNwFTgDWY0EihvV8HJgCICqfioijUWkvvvaf1X1hIisw/li+tBdvg6IKbKfHsBn6oxrj6oWN5/AUuAP4oyxPk9Vt4rIAKAbsNIZ8oU6nBzIrQCY7T73AN6B3zqJyGNAQ6Au8JHfMeboyWaVBsAMt6ahOF+cp9MT+KX7/BWciWa83lJnQLeNIlLSsOF1xBnWuAXOWDufFLNOE+BAkWUrVHU7gIi8hvO5zAWOU/i8H/P7TGL8tt8LXHi6N2fOTpYATKURkUY4/813FhHF+fJWEbm/nLs6BqCqBSJyQt1/NXG+mMv9O6uqr7rNM9cBH4jIHTjjusxQ1YfLsgv353ScGshaERmH8x+0109+z/8fsFBVbxJnfP5F5Y25iGN+z0ua6OOIqsa7zVIf4fQBpBVdB2fcGH9Fx4Lxloued//PxP8zqO3u11RB1gdgKtNQ4BVVvUhVY1S1JbAD6A0cwpmu0OtznOYiRKQfsE+LjK9fRsuAPuKMaulNQoWIyMXAdlVNw2n/jsMZwG2oiDT1biciF7mbRHBy1MVROE1SuPFnu/0Qo0uJqQEnh+od57e86Dnwl87JtvTROOen3FT1ZyAV+F3RDmlV/RGIFBH/JJAkzsi5EcAITr7XsmrLydEyTRVjCcBUppE47cX+3nCXLwQ6eDtAcdr6u4lIJvA4J4ezLRdVzQFuB+aJyFpONt34Gw6sd5tIOuFM67cR+F+cmdoycZpMvMMn/4Tzxbgep0bzqLv8jzgzbS0BNpcS1j+Av4nIagrXWIqeA3/3Are4sYwBfnvaN18CVfWOcDmymJc/xmnm8VoJTMZpNtrBqZ/f6VwBvF+BMM1ZwEYDNaYIETmsqnVDHUcgiEhX4H9UdYxb8/q9qg6u4L5qAYtxZrzLO9365uxjNQBjwog6k8cvlEq4EQxoBTxkX/5Vl9UAjDEmTFkNwBhjwpQlAGOMCVOWAIwxJkxZAjDGmDBlCcAYY8LU/wdLq6OrDPfi7wAAAABJRU5ErkJggg==\n",
"text/plain": [
"